home *** CD-ROM | disk | FTP | other *** search
/ MACD 5 / MACD 5.bin / workbench / libs / intuisup.lha / Intuisup / source.lha / Editor / list.c < prev    next >
C/C++ Source or Header  |  1992-10-02  |  10KB  |  345 lines

  1. /* $Revision Header *** Header built automatically - do not edit! ***********
  2.  *
  3.  *    (C) Copyright 1991 by Torsten Jürgeleit
  4.  *
  5.  *    Name .....: list.c
  6.  *    Created ..: Sunday 22-Dec-91 21:22:40
  7.  *    Revision .: 0
  8.  *
  9.  *    Date        Author                 Comment
  10.  *    =========   ====================   ====================
  11.  *    22-Dec-91   Torsten Jürgeleit      Created this file!
  12.  *
  13.  ****************************************************************************
  14.  *
  15.  *    Text list part
  16.  *
  17.  * $Revision Header ********************************************************/
  18.  
  19.  /* Includes */
  20.  
  21. #include "includes.h"
  22. #include "defines.h"
  23. #include "imports.h"
  24. #include "protos.h"
  25.  
  26.  /* Defines for text list editor gadgets */
  27.  
  28. #define LIST_GADGET_LISTVIEW        0
  29. #define LIST_GADGET_STRING        1
  30. #define LIST_GADGET_EDIT        2
  31. #define LIST_GADGET_ADD            3
  32. #define LIST_GADGET_INSERT        4
  33. #define LIST_GADGET_DELETE        5
  34.  
  35. #define LIST_GADGET1_TYPE        GADGET_DATA_TYPE_LISTVIEW
  36. #define LIST_GADGET1_FLAGS        GADGET_DATA_FLAG_HOTKEY
  37. #define LIST_GADGET1_TEXT        "Text _list"
  38. #define LIST_GADGET1_LEFT_EDGE        10
  39. #define LIST_GADGET1_TOP_EDGE        28
  40. #define LIST_GADGET1_WIDTH        196
  41. #define LIST_GADGET1_HEIGHT        31
  42. #define LIST_GADGET1_TEXT_ATTR        &topaz80_attr
  43. #define LIST_GADGET1_SPACING        1
  44. #define LIST_GADGET1_TOP        0
  45. #define LIST_GADGET1_LIST        NULL
  46.  
  47. #define LIST_GADGET2_TYPE        GADGET_DATA_TYPE_STRING
  48. #define LIST_GADGET2_FLAGS        (GADGET_DATA_FLAG_HOTKEY | GADGET_DATA_FLAG_TEXT_RIGHT)
  49. #define LIST_GADGET2_LEFT_EDGE        LIST_GADGET1_LEFT_EDGE
  50. #define LIST_GADGET2_TOP_EDGE        (LIST_GADGET1_TOP_EDGE + LIST_GADGET1_HEIGHT + 1)
  51. #define LIST_GADGET2_WIDTH        (LIST_GADGET1_WIDTH - (4 + 1) * 8)
  52. #define LIST_GADGET2_HEIGHT        12
  53. #define LIST_GADGET2_TEXT        "_Text"
  54. #define LIST_GADGET2_TEXT_ATTR        &topaz80_attr
  55. #define LIST_GADGET2_INPUT_LEN        80
  56. #define LIST_GADGET2_INPUT_NEXT        0
  57. #define LIST_GADGET2_INPUT_DEFAULT    NULL
  58.  
  59. #define LIST_GADGET3_TYPE        GADGET_DATA_TYPE_BUTTON
  60. #define LIST_GADGET3_FLAGS        (GADGET_DATA_FLAG_HOTKEY | GADGET_DATA_FLAG_BUTTON_TOGGLE)
  61. #define LIST_GADGET3_LEFT_EDGE        LIST_GADGET1_LEFT_EDGE
  62. #define LIST_GADGET3_TOP_EDGE        (LIST_GADGET2_TOP_EDGE + LIST_GADGET2_HEIGHT + 3)
  63. #define LIST_GADGET3_WIDTH        ((LIST_GADGET1_WIDTH - 3 * 4) / 4)
  64. #define LIST_GADGET3_HEIGHT        13
  65. #define LIST_GADGET3_TEXT        "_Edit"
  66. #define LIST_GADGET3_TEXT_ATTR        &topaz80_attr
  67.  
  68. #define LIST_GADGET4_TYPE        GADGET_DATA_TYPE_BUTTON
  69. #define LIST_GADGET4_FLAGS        (GADGET_DATA_FLAG_HOTKEY | GADGET_DATA_FLAG_BUTTON_TOGGLE)
  70. #define LIST_GADGET4_LEFT_EDGE        (LIST_GADGET3_LEFT_EDGE + LIST_GADGET3_WIDTH + 4)
  71. #define LIST_GADGET4_TOP_EDGE        LIST_GADGET3_TOP_EDGE
  72. #define LIST_GADGET4_WIDTH        LIST_GADGET3_WIDTH
  73. #define LIST_GADGET4_HEIGHT        LIST_GADGET3_HEIGHT
  74. #define LIST_GADGET4_TEXT        "_Add"
  75. #define LIST_GADGET4_TEXT_ATTR        &topaz80_attr
  76.  
  77. #define LIST_GADGET5_TYPE        GADGET_DATA_TYPE_BUTTON
  78. #define LIST_GADGET5_FLAGS        (GADGET_DATA_FLAG_HOTKEY | GADGET_DATA_FLAG_BUTTON_TOGGLE)
  79. #define LIST_GADGET5_LEFT_EDGE        (LIST_GADGET4_LEFT_EDGE + LIST_GADGET4_WIDTH + 4)
  80. #define LIST_GADGET5_TOP_EDGE        LIST_GADGET4_TOP_EDGE
  81. #define LIST_GADGET5_WIDTH        LIST_GADGET4_WIDTH
  82. #define LIST_GADGET5_HEIGHT        LIST_GADGET4_HEIGHT
  83. #define LIST_GADGET5_TEXT        "_Ins"
  84. #define LIST_GADGET5_TEXT_ATTR        &topaz80_attr
  85.  
  86. #define LIST_GADGET6_TYPE        GADGET_DATA_TYPE_BUTTON
  87. #define LIST_GADGET6_FLAGS        (GADGET_DATA_FLAG_HOTKEY | GADGET_DATA_FLAG_BUTTON_TOGGLE)
  88. #define LIST_GADGET6_LEFT_EDGE        (LIST_GADGET5_LEFT_EDGE + LIST_GADGET5_WIDTH + 4)
  89. #define LIST_GADGET6_TOP_EDGE        LIST_GADGET5_TOP_EDGE
  90. #define LIST_GADGET6_WIDTH        LIST_GADGET5_WIDTH
  91. #define LIST_GADGET6_HEIGHT        LIST_GADGET5_HEIGHT
  92. #define LIST_GADGET6_TEXT        "_Del"
  93. #define LIST_GADGET6_TEXT_ATTR        &topaz80_attr
  94.  
  95.  /* Statics for text list editor gadgets */
  96.  
  97. struct GadgetData list_gadget_data[]=
  98. {
  99.     {
  100.         LIST_GADGET1_TYPE,        /* gd_Type */
  101.         LIST_GADGET1_FLAGS,        /* gd_Flags */
  102.         LIST_GADGET1_LEFT_EDGE,    /* gd_LeftEdge */
  103.         LIST_GADGET1_TOP_EDGE,    /* gd_TopEdge */
  104.         LIST_GADGET1_WIDTH,        /* gd_Width */
  105.         LIST_GADGET1_HEIGHT,    /* gd_Height */
  106.         LIST_GADGET1_TEXT,        /* *gd_Text */
  107.         LIST_GADGET1_TEXT_ATTR,    /* *gd_TextAttr */
  108.         {
  109.             LIST_GADGET1_SPACING,        /* gd_ListViewSpacing */
  110.             LIST_GADGET1_TOP,    /* gd_ListViewTop */
  111.             LIST_GADGET1_LIST    /* gd_ListViewList */
  112.         }
  113.     },
  114.     {
  115.         LIST_GADGET2_TYPE,        /* gd_Type */
  116.         LIST_GADGET2_FLAGS,        /* gd_Flags */
  117.         LIST_GADGET2_LEFT_EDGE,    /* gd_LeftEdge */
  118.         LIST_GADGET2_TOP_EDGE,    /* gd_TopEdge */
  119.         LIST_GADGET2_WIDTH,        /* gd_Width */
  120.         LIST_GADGET2_HEIGHT,    /* gd_Height */
  121.         LIST_GADGET2_TEXT,        /* *gd_Text */
  122.         LIST_GADGET2_TEXT_ATTR,    /* *gd_TextAttr */
  123.         {
  124.             LIST_GADGET2_INPUT_LEN,        /* gd_InputLen */
  125.             LIST_GADGET2_INPUT_NEXT,    /* gd_InputActivateNext/Prev */
  126.             LIST_GADGET2_INPUT_DEFAULT    /* gd_InputDefault */
  127.         }
  128.     },
  129.     {
  130.         LIST_GADGET3_TYPE,        /* gd_Type */
  131.         LIST_GADGET3_FLAGS,        /* gd_Flags */
  132.         LIST_GADGET3_LEFT_EDGE,    /* gd_LeftEdge */
  133.         LIST_GADGET3_TOP_EDGE,    /* gd_TopEdge */
  134.         LIST_GADGET3_WIDTH,        /* gd_Width */
  135.         LIST_GADGET3_HEIGHT,    /* gd_Height */
  136.         LIST_GADGET3_TEXT,        /* *gd_Text */
  137.         LIST_GADGET3_TEXT_ATTR,    /* *gd_TextAttr */
  138.         {0, 0, 0}
  139.     },
  140.     {
  141.         LIST_GADGET4_TYPE,        /* gd_Type */
  142.         LIST_GADGET4_FLAGS,        /* gd_Flags */
  143.         LIST_GADGET4_LEFT_EDGE,    /* gd_LeftEdge */
  144.         LIST_GADGET4_TOP_EDGE,    /* gd_TopEdge */
  145.         LIST_GADGET4_WIDTH,        /* gd_Width */
  146.         LIST_GADGET4_HEIGHT,    /* gd_Height */
  147.         LIST_GADGET4_TEXT,        /* *gd_Text */
  148.         LIST_GADGET4_TEXT_ATTR,    /* *gd_TextAttr */
  149.         {0, 0, 0}
  150.     },
  151.     {
  152.         LIST_GADGET5_TYPE,        /* gd_Type */
  153.         LIST_GADGET5_FLAGS,        /* gd_Flags */
  154.         LIST_GADGET5_LEFT_EDGE,    /* gd_LeftEdge */
  155.         LIST_GADGET5_TOP_EDGE,    /* gd_TopEdge */
  156.         LIST_GADGET5_WIDTH,        /* gd_Width */
  157.         LIST_GADGET5_HEIGHT,    /* gd_Height */
  158.         LIST_GADGET5_TEXT,        /* *gd_Text */
  159.         LIST_GADGET5_TEXT_ATTR,    /* *gd_TextAttr */
  160.         {0, 0, 0}
  161.     },
  162.     {
  163.         LIST_GADGET6_TYPE,        /* gd_Type */
  164.         LIST_GADGET6_FLAGS,        /* gd_Flags */
  165.         LIST_GADGET6_LEFT_EDGE,    /* gd_LeftEdge */
  166.         LIST_GADGET6_TOP_EDGE,    /* gd_TopEdge */
  167.         LIST_GADGET6_WIDTH,        /* gd_Width */
  168.         LIST_GADGET6_HEIGHT,    /* gd_Height */
  169.         LIST_GADGET6_TEXT,        /* *gd_Text */
  170.         LIST_GADGET6_TEXT_ATTR,    /* *gd_TextAttr */
  171.         {0, 0, 0}
  172.     },
  173.     {
  174.         INTUISUP_DATA_END        /* mark end of gadget data array */
  175.     }
  176. };
  177. STATIC struct Node *last_node;    /* last selected text list entry */
  178. STATIC BYTE *last_text;            /* last text defined by string gadget */
  179. STATIC USHORT list_mode;
  180.  
  181.  /* Change mode of text list editor mode */
  182.  
  183. VOID
  184. change_text_list_editor_mode(APTR gl, USHORT mode)
  185. {
  186.     /* Unselect old mode gadget */
  187.     ISetGadgetAttributes(gl, LIST_GADGET_EDIT + list_mode, 0L, 0L,
  188.                          0L, USE_CURRENT_VALUE, (VOID *) USE_CURRENT_VALUE);
  189.     /* Select new mode gadget */
  190.     ISetGadgetAttributes(gl, LIST_GADGET_EDIT + mode, 0L, 0L,
  191.                          1L, USE_CURRENT_VALUE, (VOID *) USE_CURRENT_VALUE);
  192.     list_mode = mode;
  193.  
  194.     /* Reset string gadget and some variables */
  195.     ISetGadgetAttributes(gl, LIST_GADGET_STRING, 0L, 0L,
  196.                          USE_CURRENT_VALUE, USE_CURRENT_VALUE, NULL);
  197.     last_node = NULL;
  198.     last_text = NULL;
  199. }
  200.  
  201.  /* Perform gadget action text list editor */
  202.  
  203. SHORT
  204. perform_text_list_editor_action(APTR gl, struct Template *tp, USHORT entry,
  205.                                 ULONG value)
  206. {
  207.     struct List *list = &tp->tp_TextList;
  208.     struct Node *node;
  209.     SHORT status = EDITOR_STATUS_NORMAL;
  210.  
  211.     switch (entry)
  212.     {
  213.     case LIST_GADGET_LISTVIEW:
  214.         node = last_node = get_node(list, (USHORT) value);
  215.         switch (list_mode)
  216.         {
  217.         case LIST_MODE_EDIT:
  218.         case LIST_MODE_ADD:
  219.  
  220.             /* Copy selected text to string gadget */
  221.             ISetGadgetAttributes(gl, LIST_GADGET_STRING, 0L, 0L,
  222.                                  USE_CURRENT_VALUE, USE_CURRENT_VALUE, node->ln_Name);
  223.             break;
  224.  
  225.         case LIST_MODE_INSERT:
  226.  
  227.             /* Insert text from string gadget before selected entry */
  228.             if (last_text)
  229.             {
  230.                 struct Node *list_node = get_pred(node);
  231.  
  232.                 if (!(node = build_text_list_entry(last_text)))
  233.                 {
  234.                     status = EDITOR_ERROR_OUT_OF_MEM;
  235.                 }
  236.                 else
  237.                 {
  238.                     Insert(list, node, list_node);
  239.                     ISetGadgetAttributes(gl, LIST_GADGET_LISTVIEW, 0L, 0L,
  240.                                          USE_CURRENT_VALUE, USE_CURRENT_VALUE, list);
  241.                 }
  242.             }
  243.             break;
  244.  
  245.         case LIST_MODE_DELETE:
  246.  
  247.             /* Delete selected entry */
  248.             Remove(node);
  249.             free_text_list_entry(node);
  250.             ISetGadgetAttributes(gl, LIST_GADGET_LISTVIEW, 0L, 0L,
  251.                                  USE_CURRENT_VALUE, USE_CURRENT_VALUE, list);
  252.             break;
  253.         }
  254.         break;
  255.  
  256.     case LIST_GADGET_STRING:
  257.         last_text = (BYTE *) value;
  258.         switch (list_mode)
  259.         {
  260.         case LIST_MODE_EDIT:
  261.  
  262.             /* Replace text of last selected entry by this one */
  263.             if (last_node)
  264.             {
  265.                 BYTE *text;
  266.  
  267.                 if (!(text = (BYTE *)malloc((LONG) (strlen((BYTE *) value) +
  268.                                             1))))
  269.                 {
  270.                     status = EDITOR_ERROR_OUT_OF_MEM;
  271.                 }
  272.                 else
  273.                 {
  274.                     free(last_node->ln_Name);
  275.                     last_node->ln_Name = text;
  276.                     strcpy(text, (BYTE *) value);
  277.                     ISetGadgetAttributes(gl, LIST_GADGET_LISTVIEW, 0L, 0L,
  278.                                          USE_CURRENT_VALUE, USE_CURRENT_VALUE, list);
  279.                 }
  280.             }
  281.             break;
  282.  
  283.         case LIST_MODE_ADD:
  284.  
  285.             /* Add text to end of list */
  286.             if (!(node = build_text_list_entry((BYTE *) value)))
  287.             {
  288.                 status = EDITOR_ERROR_OUT_OF_MEM;
  289.             }
  290.             else
  291.             {
  292.                 AddTail(list, node);
  293.                 ISetGadgetAttributes(gl, LIST_GADGET_LISTVIEW, 0L, 0L,
  294.                                      USE_CURRENT_VALUE, USE_CURRENT_VALUE, list);
  295.             }
  296.             break;
  297.         }
  298.         break;
  299.  
  300.     default:
  301.  
  302.         /* Set new text list editor mode */
  303.         change_text_list_editor_mode(gl, entry - LIST_GADGET_EDIT);
  304.         break;
  305.     }
  306.     if (status == EDITOR_STATUS_NORMAL)
  307.     {
  308.         struct GadgetData *gd = &tp->tp_Data.tp_GadgetData;
  309.         BYTE **text_array;
  310.  
  311.         /* Change template data */
  312.         switch (gd->gd_Type)
  313.         {
  314.         case GADGET_DATA_TYPE_MX:
  315.             text_array = gd->gd_SpecialData.gd_MXData.gd_MXTextArray;
  316.             if ((status = build_template_text_array(tp)) !=
  317.                 EDITOR_STATUS_NORMAL)
  318.             {
  319.                 gd->gd_SpecialData.gd_MXData.gd_MXTextArray = text_array;
  320.             }
  321.             else
  322.             {
  323.                 free(text_array);
  324.             }
  325.             break;
  326.         case GADGET_DATA_TYPE_CYCLE:
  327.             text_array = gd->gd_SpecialData.gd_CycleData.gd_CycleTextArray;
  328.             if ((status = build_template_text_array(tp)) !=
  329.                 EDITOR_STATUS_NORMAL)
  330.             {
  331.                 gd->gd_SpecialData.gd_CycleData.gd_CycleTextArray = text_array;
  332.             }
  333.             else
  334.             {
  335.                 free(text_array);
  336.             }
  337.             break;
  338.         case GADGET_DATA_TYPE_LISTVIEW:
  339.             gd->gd_SpecialData.gd_ListViewData.gd_ListViewList = &tp->tp_TextList;
  340.             break;
  341.         }
  342.     }
  343.     return (status);
  344. }
  345.